package com.bpm.stringsimulator.model;

/**
 * Klasa jest odpowiedzialna za obsluge pojedynczej struny.
 * 
 * @author piotrs10
 * 
 */
public class GuitarString {

	/**
	 * Skladowa harmoniczna
	 */
	private static final long HARMONIC = 1;
	/**
	 * Nazwa struny, okreslana poprzez jej docelowy dzwiek np D
	 */
	private String name;

	/**
	 * Napiecie w danej chwili
	 */
	private double tension;

	/**
	 * Aktualna dlugosc struny
	 */
	private double length;

	/**
	 * Masa struny
	 */
	private double mass;

	/**
	 * Konstruktor tworzacy strune, zawierajacy wszystkie wymagane parametry.
	 * 
	 * @param name
	 * @param tension
	 * @param length
	 * @param mass
	 */
	public GuitarString(String name, double tension, double length, double mass) {
		super();
		this.name = name;
		this.tension = tension;
		this.length = length;
		this.mass = mass;
	}

	/**
	 * Pobiera nazwe struny.
	 * 
	 * @return Nazwa struny
	 */
	public String getName() {
		return name;
	}

	/**
	 * Pobiera napiecie struny.
	 * 
	 * @return Napiecie struny
	 */
	public double getTension() {
		return tension;
	}

	/**
	 * Ustawia napiecie struny.
	 * 
	 * @param tension
	 */
	public void setTension(double tension) {
		this.tension = tension;
	}

	/**
	 * Pobiera dlugosc struny
	 * 
	 * @return
	 */
	public double getLength() {
		return length;
	}

	/**
	 * Ustawia dlugosc struny
	 * 
	 * @param length
	 */
	public void setLength(double length) {
		this.length = length;
	}

	public double getMass() {
		return mass;
	}

	/**
	 * Oblicza i zwraca czestotliwosc dzwieku wydobywanego przez strune.
	 * 
	 * @return Czestotliwosc dzwieku.
	 * @throws FrequencyComputationException
	 *             Wyrzucane w przypadku bledu obliczen czestotliwosci.
	 */
	public double getFrequency() throws FrequencyComputationException {
		if (length == 0) {
			throw new FrequencyComputationException(
					"Nie mozna obliczyc czestotliwosci, dla dlugosci struny rownej 0");
		}
		double density = mass / length; // masa wlasciwa = masa / dlugosc
		double frequency = HARMONIC * Math.sqrt(tension / density)
				/ (2 * length);
		return frequency;
	}

	/**
	 * Zwieksza naciag struny o zadany ulamek.
	 * 
	 * @param fraction
	 *            Ulamek.
	 */
	public void increaseTensionByFraction(double fraction) {
		tension += fraction * tension;
	}

	/**
	 * Zwieksza dlugosc struny o zadany ulamek.
	 * 
	 * @param fraction
	 *            Ulamek.
	 */
	public void increaseLengthByFraction(double fraction) {
		length += fraction * length;
	}

	/**
	 * Zminejsza naciag struny o zadany ulamek.
	 * 
	 * @param fraction
	 *            Ulamek.
	 */
	public void decreaseTensionByFraction(double fraction) {
		tension -= fraction * tension;
	}

	/**
	 * Zmniejsza dlugosc struny o zadany ulamek.
	 * 
	 * @param fraction
	 *            Ulamek.
	 */
	public void decreaseLengthByFraction(double fraction) {
		length -= fraction * length;
	}
}
